package cn.xaut.优先队列;

import java.util.Comparator;
import java.util.PriorityQueue;

public class test {

    public static void main(String[] args) {

        // 默认的 PriorityQueue ，底层实现是最小堆
        PriorityQueue<Integer> pq = new PriorityQueue<>();

        for (int i = 0; i < 10; i++) {
            int num = (int) (Math.random() * 100);
            pq.offer(num);
            System.out.println((i + 1) + "\t向优先队列中插入了" + num);
        }

        System.out.println(pq);

        while (!pq.isEmpty())
            System.out.print(pq.poll() + " ");
        System.out.println();

        System.out.println();
        System.out.println();

        // 使用 lambda 表达式，创建底层是最大堆的PriorityQueue
        PriorityQueue<Integer> pq2 = new PriorityQueue<>(10, (a, b) -> b - a);

        for (int i = 0; i < 10; i++) {
            int num = (int) (Math.random() * 100);
            pq2.offer(num);
            System.out.println((i + 1) + "\t向优先队列中插入了" + num);
        }

        System.out.println(pq2);

        while (!pq2.isEmpty())
            System.out.print(pq2.poll() + " ");
        System.out.println();

        System.out.println();
        System.out.println();


        // 使用自定义的Comparator，创建个性化的PriorityQueue
        // 注意：也可以使用lambda表达式。在这里只是为了演示PriorityQueue的不同用法
        // 同理，上一个例子也可以使用自定义的Comparator的方式完成
        class myComparator implements Comparator<Integer> {
            @Override
            public int compare(Integer o1, Integer o2) {
                if (o1 % 10 != o2 % 10)
                    return o1 % 10 - o2 % 10;
                return o1 - o2;
            }
        }
        
        class myComparator2 implements Comparator<Integer> {

            // 最大堆
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        }

        PriorityQueue<Integer> pq3 = new PriorityQueue<>(10, new myComparator2());
        PriorityQueue<Integer> pq4 = new PriorityQueue<>(new myComparator());
        
        for (int i = 0; i < 10; i++) {
            int num = (int) (Math.random() * 100);
            pq3.offer(num);
            pq4.offer(num);
            System.out.println((i + 1) + "\t向优先队列 pq3 中插入了" + num);
            System.out.println((i + 1) + "\t向优先队列 pq4 中插入了" + num);
        }

        System.out.println(pq3);

        while (!pq3.isEmpty())
            System.out.print(pq3.poll() + " ");
        System.out.println();
        System.out.println();
        
        System.out.println(pq4);

        while (!pq4.isEmpty())
            System.out.print(pq4.poll() + " ");
        System.out.println();
        System.out.println();


        PriorityQueue<Integer> pq5 = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
    }
}

